public class Cuadrado {

	private Punto superiorIzquierdo;
	private Punto superiorDerecho;
	private Punto inferiorDerecho;
	private Punto inferiorIzquierdo;
   
	/**
	 * @post Crea un cuadrado con su extremo superior izquierdo e inferiorn
	 *       derecho, ambos especificados por constructor. De no generarse un
	 *       cuadrado o no respetar la posicion de los puntos, se fuerza al punto 
	 *       inferior derecho y queda un cuadrado de lado 1. 
	 */
	public Cuadrado(Punto superiorIzquierdo, Punto inferiorDerecho) {

		this.superiorIzquierdo = superiorIzquierdo;
		
		if ((inferiorDerecho.getCoordenadaEjeX() - superiorIzquierdo.getCoordenadaEjeX()) 
			 != 
			(superiorIzquierdo.getCoordenadaEjeY() - inferiorDerecho.getCoordenadaEjeY())){
	
			inferiorDerecho.setCoordenadaEjeX(superiorIzquierdo.getCoordenadaEjeX() + 1);
			inferiorDerecho.setCoordenadaEjey(superiorIzquierdo.getCoordenadaEjeY() - 1);
		}
		this.inferiorDerecho = inferiorDerecho;
		this.obtenerPuntosFaltantes();
	}

	public Punto getSuperiorIzquierdo() {
		return this.superiorIzquierdo;
	}

	public Punto getSuperiorDerecho() {
		return this.superiorDerecho;
	}
	public Punto getInferiorDerecho() {
		return this.inferiorDerecho;
	}
	public Punto getInferiorIzquierdo() {
		return this.inferiorIzquierdo;
	}
	

	/** @post ¿Pertenece el punto al Cuadrado? */
	public boolean pertenece(Punto unPunto) {
		return (unPunto.coordenadaEjeXPerteneceAlIntervalo(this.superiorIzquierdo.getCoordenadaEjeX(),this.inferiorDerecho.getCoordenadaEjeX()) && 
				unPunto.coordenadaEjeYPerteneceAlIntervalo(this.inferiorDerecho.getCoordenadaEjeY(),this.superiorIzquierdo.getCoordenadaEjeY()));
	}

	/** @post ¿Hay intersección entre los Cuadrados? */
	public boolean hayInterseccion(Cuadrado otroCuadrado) {
		return (this.pertenece(otroCuadrado.getSuperiorIzquierdo()) ||
				this.pertenece(otroCuadrado.getInferiorDerecho()) ||
				this.pertenece(otroCuadrado.getSuperiorDerecho()) ||
				this.pertenece(otroCuadrado.getInferiorIzquierdo()));
	}
	
   /**@post Genera los puntos inferiorIzquierdo y superiorDerecho del cuadrado*/
	private void obtenerPuntosFaltantes(){
		this.inferiorIzquierdo = new Punto(this.superiorIzquierdo.getCoordenadaEjeX(), this.inferiorDerecho.getCoordenadaEjeY());
		this.superiorDerecho = new Punto(this.inferiorDerecho.getCoordenadaEjeX(), this.superiorIzquierdo.getCoordenadaEjeY());
	}
}
